#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 400 + 7;
int n, k, p, a[maxn], d[maxn], f[maxn], dp[maxn][maxn];
int qpow(int x, int y) {
    int res(1);
    while (y) {
        if (y & 1) res *= x;
        x *= x;
        y >>= 1;
    }
    return res;
}
signed main() {
    scanf("%d%d%d", &n, &k, &p);
    int now = 0;
    for (int i = 1;; ++i) {
        a[i] = qpow(i, p);
        if (a[i] > n) {
            now = i - 1;
            break;
        }
    }
    for (int i = 0; i <= n; ++i) f[i] = d[i] = -1;  // d[i]是临时数组
    f[0] = 0;                       // f[i] 表示达到i可选的最大数
    for (int i = 1; i <= k; ++i) {  // 位置
        for (int j = 1; j <= now; ++j) {     // 可选的数
            for (int p = a[j]; p <= n; ++p)  // 差值
                if (f[p - a[j]] != -1 && f[p - a[j]] + j >= d[p]) {
                    // 让当前位置可以更大则转移
                    d[p] = f[p - a[j]] + j;
                    dp[i][p] = max(dp[i][p], j);
                    // dp[i][j] 表示 有i个位置 要达到j 第i个位置放什么
                }
        }
        for (int j = 0; j <= n; ++j) f[j] = d[j], d[j] = -1;
    }
    if (f[n] == -1) {
        puts("Impossible");
        return 0;
    }
    vector<int> ans;
    int top = k, sum = n;
    while (top) {
        ans.emplace_back(dp[top--][sum]);
        sum -= a[ans.back()];
    }
    printf("%d =", n);
    for (int i = 0; i < k; ++i) {
        printf(" %d^%d", ans[i], p);
        if (i != k - 1) printf(" +");
    }
    puts("");
    return 0;
}
/*
main code without comment come from
https://gitee.com/wen-guan-yang/pta/blob/master/j1.cpp under ISC License
*/